/*********************************************************
 * 初学之家(http://www.g2room.com)，提供Java、Javascript（js）、Jquery、
 * 等一些工具或常用功能的实现例子代码，希望能给初学者提供学习和工作上的帮助，
 * 也希望有想提供源代码的朋友能联系我，一起努力，提供更多、更全面、更详细的
 * 一些初学代码例子及经验，帮助更多的人。
 * 
 * 我的联系方式：E-Mail：g2room@163.com
 * 网址：http://www.g2room.com
 * QQ：天涯（1173930590）
 * QQ交流群：323642758
 * 
 * 本站内容为提供各种java、javascript(JS)常用的工具源代码、实例（示例）、
 * 基本配置、教程、手册等；目前Java代码提供的工具（或转换）例子代码如下：
 * BASE64转换工具、bytes相关操作、email收发、文件操作（读写、拷贝、遍历、
 * 多线程copy等）、json格式转换、日志（Log4j）操作工具、Lucene搜索引擎的
 * 创建索引和搜索、各种不同Map的使用、定时器（Quartz）的使用例子、Socket的
 * 连接传输数据例子、WebService的例子及一些常用的工具类如String、Date及
 * JDK自带的一些工具类及函数的使用例子。
 * 
 * 说明：如需直接使用本站的例子代码，请保留此说明
 * 
 ********************************************************/
package com.g2room.net.socket;

import java.io.IOException;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
 * 
 *
 * @createTime: Nov 11, 2013 9:41:30 PM
 * @author: <a href="mailto:g2room@163.com">天涯</a>
 * @version: 0.1
 * @lastVersion: 0.1
 * @updateTime: 
 * @updateAuthor: <a href="mailto:g2room@163.com">天涯</a>
 * @changesSum: 
 * 
 */
public class SocketServer {
	
	private ServerSocket socket;
	private int port = 8901;
	private String host = "127.0.0.1";
	
	SocketServer() throws IOException{
//		socket = new ServerSocket(port, 2);
//		// 设置accept从队列中获取客户端连接等待的超时时间，单位为毫秒
//		// 为0时则不超时
//		socket.setSoTimeout(10*1000);
		System.out.println("服务启动，绑定端口：" + port);
		
//		Socket socket = null;
		// 默认绑定，不设置任何参数
//		socket = new Socket();
//		System.out.println(socket.getLocalPort());
		/**
		 * 绑定到指定端口，取值为0~65535。
		 * 抛出BindException错误的情况：
		 * 1、指定（如80）端口被绑定；
		 * 2、不是系统管理员身份，但是想绑定1~1023端口
		 * 如果为0，则表示由系统自动分配空闲端口
		 * 实际上此构造函数时调用的是ServerSocket(port, 50, null);
		 */
//		socket = new ServerSocket(8099);
		/**
		 * 同上，只是增加了指定队列长度的参数，不指定默认为50
		 * ServerSocket构造方法的backlog参数用来显式设置连接请求队列的长度，
		 * 它将覆盖操作系统限定的队列的最大长度。值得注意的是，
		 * 在以下几种情况中，仍然会采用操作系统限定的队列的最大长度：
		 * 1、backlog参数的值大于操作系统限定的队列的最大长度；
		 * 2、backlog参数的值小于或等于0；
		 * 3、在ServerSocket构造方法中没有设置backlog参数。
		 */
//		socket = new ServerSocket(8098, 10);
		/**
		 * 使用地址的方式来
		 */
		InetAddress bindAddr = InetAddress.getByName(host);
		socket = new ServerSocket(port, 50, bindAddr);
	}
	public void handleRequest() {
		while(true) {
			Socket socket = null;
			// 从连接请求队列中取出一个连接
			try {
				socket = this.socket.accept();
				System.out.println("获取新连接：address:"+socket.getInetAddress()
					+ ",port:" + socket.getPort()
					+ ",localPort:" + socket.getLocalPort());
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				try {
					if(null != socket) {
						socket.close();
						System.out.println("关闭连接");
					}
				} catch(IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	public static void main(String[] args) {
		try {
			SocketServer server = new SocketServer();
			server.handleRequest();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
